# -*- encoding: utf8 -*-
from app import login_manager
from app.libs.helper import is_isbn_or_key
from app.models.base import Base
from sqlalchemy import Column, Integer, String, Boolean, Float
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import UserMixin

from app.models.gift import Gift
from app.models.wish import Wish
from app.spider.yushu_book import YuShuBook


class User(Base, UserMixin):
    # __tablename__ = 'base' 对默认表名进行更改
    id = Column(Integer, primary_key=True)
    nickname = Column(String(24), nullable=False)
    phone_number = Column(String(18), unique=True)
    _password = Column('password', String(128), nullable=False)  # db中的密码不能用明文，要加密
    email = Column(String(50), unique=True, nullable=False)
    confirmed = Column(Boolean, default=False)
    beans = Column(Float, default=0)
    send_counter = Column(Integer, default=0)
    receive_counter = Column(Integer, default=0)
    wx_open_id = Column(String(50))
    wx_name = Column(String(32))

    # 读取数据
    @property
    def password(self):
        return self._password

    # 写入数据
    @password.setter
    def password(self, raw):
        self._password = generate_password_hash(raw)

    def check_password(self, raw):
        return check_password_hash(self.password, raw)

    # login_user 需要定义这样一个函数，返回可以表示用户身份的字段，
    # 类似这样的函数在flask_login中的UserMixin类中都定义好了，只需要User继承这个类就OK了
    # UserMixin中默认是以id作为验证字段，如果逻辑中不是用这个字段表示，还要写get_id函数，覆盖原函数
    # def get_id(self):
    #     return self.id

    def can_save_to_list(self, isbn):
        if is_isbn_or_key(isbn) != 'isbn':
            return False
        yushu_book = YuShuBook()
        yushu_book.search_by_isbn(isbn)
        if not yushu_book.first:
            return False

        # 逻辑分析：
        # 不允许一个用户同时赠送多本相同的图书
        # 不允许一个用户同时是赠送者与索要者

        # 必须满足：既不在心愿清单中，也不在赠送清单中才能添加
        gifting = Gift.query.filter_by(uid=self.id, isbn=isbn, launched=False).first()
        wishing = Wish.query.filter_by(uid=self.id, isbn=isbn, launched=False).first()

        if not gifting and not wishing:
            return True
        else:
            return False


# 利用cookie中存储的uid信息，将uid转换为User对象模型
@login_manager.user_loader
def get_user(uid):
    return User.query.get(int(uid))
